#ifndef __WIZ_ACCESSOR_INNER_HPP__SHANHAOBO_19800429__
#define __WIZ_ACCESSOR_INNER_HPP__SHANHAOBO_19800429__

#include "../../../Include/Core/Accessor/WizAccessor.hpp"

namespace Wiz
{
    namespace Accessor
    {
        namespace Base
        {
            struct WIZ_PRIVATE Type
            {
                ///===================================///

                virtual ::Wiz::Bool::Type Read(::Wiz::Byte::OutPtr, ::Wiz::Size::In) = 0;
                virtual ::Wiz::Bool::Type Write(::Wiz::Byte::InPtr, ::Wiz::Size::In) = 0;

                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Byte::OutPtr, ::Wiz::Size::In) = 0;
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Byte::InPtr, ::Wiz::Size::In) = 0;

                ///===================================///
                virtual ::Wiz::Bool::Type Read(::Wiz::Boolean8::Out)    = 0;
                virtual ::Wiz::Bool::Type Read(::Wiz::Boolean16::Out)   = 0;
                virtual ::Wiz::Bool::Type Read(::Wiz::Boolean32::Out)   = 0;
                virtual ::Wiz::Bool::Type Read(::Wiz::Boolean64::Out)   = 0;

                virtual ::Wiz::Bool::Type Read(::Wiz::Int8::Out)        = 0;
                virtual ::Wiz::Bool::Type Read(::Wiz::Int16::Out)       = 0;
                virtual ::Wiz::Bool::Type Read(::Wiz::Int32::Out)       = 0;
                virtual ::Wiz::Bool::Type Read(::Wiz::Int64::Out)       = 0;

                virtual ::Wiz::Bool::Type Read(::Wiz::UInt8::Out)       = 0;
                virtual ::Wiz::Bool::Type Read(::Wiz::UInt16::Out)      = 0;
                virtual ::Wiz::Bool::Type Read(::Wiz::UInt32::Out)      = 0;
                virtual ::Wiz::Bool::Type Read(::Wiz::UInt64::Out)      = 0;

                virtual ::Wiz::Bool::Type Read(::Wiz::Real16::Out)      = 0;
                virtual ::Wiz::Bool::Type Read(::Wiz::Real32::Out)      = 0;
                virtual ::Wiz::Bool::Type Read(::Wiz::Real64::Out)      = 0;
                ///===================================///

                ///===================================///
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Boolean8::Out)    = 0;
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Boolean16::Out)   = 0;
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Boolean32::Out)   = 0;
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Boolean64::Out)   = 0;

                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Int8::Out)        = 0;
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Int16::Out)       = 0;
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Int32::Out)       = 0;
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Int64::Out)       = 0;

                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::UInt8::Out)       = 0;
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::UInt16::Out)      = 0;
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::UInt32::Out)      = 0;
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::UInt64::Out)      = 0;

                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Real16::Out)      = 0;
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Real32::Out)      = 0;
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Real64::Out)      = 0;
                ///===================================///

                ///===================================///
                virtual ::Wiz::Bool::Type Write(::Wiz::Boolean8::In)    = 0;
                virtual ::Wiz::Bool::Type Write(::Wiz::Boolean16::In)   = 0;
                virtual ::Wiz::Bool::Type Write(::Wiz::Boolean32::In)   = 0;
                virtual ::Wiz::Bool::Type Write(::Wiz::Boolean64::In)   = 0;

                virtual ::Wiz::Bool::Type Write(::Wiz::Int8::In)        = 0;
                virtual ::Wiz::Bool::Type Write(::Wiz::Int16::In)       = 0;
                virtual ::Wiz::Bool::Type Write(::Wiz::Int32::In)       = 0;
                virtual ::Wiz::Bool::Type Write(::Wiz::Int64::In)       = 0;

                virtual ::Wiz::Bool::Type Write(::Wiz::UInt8::In)       = 0;
                virtual ::Wiz::Bool::Type Write(::Wiz::UInt16::In)      = 0;
                virtual ::Wiz::Bool::Type Write(::Wiz::UInt32::In)      = 0;
                virtual ::Wiz::Bool::Type Write(::Wiz::UInt64::In)      = 0;

                virtual ::Wiz::Bool::Type Write(::Wiz::Real16::In)      = 0;
                virtual ::Wiz::Bool::Type Write(::Wiz::Real32::In)      = 0;
                virtual ::Wiz::Bool::Type Write(::Wiz::Real64::In)      = 0;
                ///===================================///

                ///===================================///
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Boolean8::In)    = 0;
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Boolean16::In)   = 0;
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Boolean32::In)   = 0;
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Boolean64::In)   = 0;

                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Int8::In)        = 0;
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Int16::In)       = 0;
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Int32::In)       = 0;
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Int64::In)       = 0;

                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::UInt8::In)       = 0;
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::UInt16::In)      = 0;
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::UInt32::In)      = 0;
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::UInt64::In)      = 0;

                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Real16::In)      = 0;
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Real32::In)      = 0;
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Real64::In)      = 0;
                ///===================================///
            };
            WIZ_DECLARE(::Wiz::Accessor::Base::Type);
        } /// end of namespace Base

        namespace Inner
        {
            struct WIZ_PRIVATE Type : public ::Wiz::Accessor::Type
            {
                typedef ::Wiz::Accessor::Type tSuper;

                Type() : tSuper(), m_EndianPtr(WIZ_NULLPTR)
                {

                }

                virtual ~Type()
                {
                    if (::Wiz::IsValidPtr(m_EndianPtr))
                    {
                        delete m_EndianPtr;
                        m_EndianPtr = WIZ_NULLPTR;
                    }
                }

                ::Wiz::Accessor::Base::Ptr m_EndianPtr;

                ///===================================///

                virtual ::Wiz::Bool::Type SwitchEndian(::Wiz::Endian::In InData);

                ///===================================///

                ///===================================///
                virtual ::Wiz::Bool::Type Read(::Wiz::Boolean8::Out OutData);
                virtual ::Wiz::Bool::Type Read(::Wiz::Boolean16::Out OutData);
                virtual ::Wiz::Bool::Type Read(::Wiz::Boolean32::Out OutData);
                virtual ::Wiz::Bool::Type Read(::Wiz::Boolean64::Out OutData);

                virtual ::Wiz::Bool::Type Read(::Wiz::Int8::Out OutData);
                virtual ::Wiz::Bool::Type Read(::Wiz::Int16::Out OutData);
                virtual ::Wiz::Bool::Type Read(::Wiz::Int32::Out OutData);
                virtual ::Wiz::Bool::Type Read(::Wiz::Int64::Out OutData);

                virtual ::Wiz::Bool::Type Read(::Wiz::UInt8::Out OutData);
                virtual ::Wiz::Bool::Type Read(::Wiz::UInt16::Out OutData);
                virtual ::Wiz::Bool::Type Read(::Wiz::UInt32::Out OutData);
                virtual ::Wiz::Bool::Type Read(::Wiz::UInt64::Out OutData);

                virtual ::Wiz::Bool::Type Read(::Wiz::Real16::Out OutData);
                virtual ::Wiz::Bool::Type Read(::Wiz::Real32::Out OutData);
                virtual ::Wiz::Bool::Type Read(::Wiz::Real64::Out OutData);

                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Boolean8::Out OutData);
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Boolean16::Out OutData);
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Boolean32::Out OutData);
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Boolean64::Out OutData);

                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Int8::Out OutData);
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Int16::Out OutData);
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Int32::Out OutData);
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Int64::Out OutData);

                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::UInt8::Out OutData);
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::UInt16::Out OutData);
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::UInt32::Out OutData);
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::UInt64::Out OutData);

                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Real16::Out OutData);
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Real32::Out OutData);
                virtual ::Wiz::Bool::Type ReadAndAdvance(::Wiz::Real64::Out OutData);
                ///===================================///

                ///===================================///

                ///===================================///
                virtual ::Wiz::Bool::Type Write(::Wiz::Boolean8::In InData);
                virtual ::Wiz::Bool::Type Write(::Wiz::Boolean16::In InData);
                virtual ::Wiz::Bool::Type Write(::Wiz::Boolean32::In InData);
                virtual ::Wiz::Bool::Type Write(::Wiz::Boolean64::In InData);

                virtual ::Wiz::Bool::Type Write(::Wiz::Int8::In InData);
                virtual ::Wiz::Bool::Type Write(::Wiz::Int16::In InData);
                virtual ::Wiz::Bool::Type Write(::Wiz::Int32::In InData);
                virtual ::Wiz::Bool::Type Write(::Wiz::Int64::In InData);

                virtual ::Wiz::Bool::Type Write(::Wiz::UInt8::In InData);
                virtual ::Wiz::Bool::Type Write(::Wiz::UInt16::In InData);
                virtual ::Wiz::Bool::Type Write(::Wiz::UInt32::In InData);
                virtual ::Wiz::Bool::Type Write(::Wiz::UInt64::In InData);

                virtual ::Wiz::Bool::Type Write(::Wiz::Real16::In InData);
                virtual ::Wiz::Bool::Type Write(::Wiz::Real32::In InData);
                virtual ::Wiz::Bool::Type Write(::Wiz::Real64::In InData);

                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Boolean8::In InData);
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Boolean16::In InData);
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Boolean32::In InData);
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Boolean64::In InData);

                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Int8::In InData);
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Int16::In InData);
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Int32::In InData);
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Int64::In InData);

                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::UInt8::In InData);
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::UInt16::In InData);
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::UInt32::In InData);
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::UInt64::In InData);

                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Real16::In InData);
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Real32::In InData);
                virtual ::Wiz::Bool::Type WriteAndAdvance(::Wiz::Real64::In InData);
                ///===================================///
            };
        } /// end of namespace Inner
    } /// end of namespace Accessor
} /// end of namespace Wiz

#endif /*__WIZ_ACCESSOR_INNER_HPP__SHANHAOBO_19800429__*/
